package threadjuc.pool;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author zxl
 * @version 1.0
 * @date 2021/10/28 10:51
 * 使用ThreadPoolExecutor 创建自定义线程池
 */
public class Pool3 {
    /**
     * 七大参数   核心数 （当前默认线程数）
     *          最大核心数   （最大线程数）
     *          空闲线程的最大存活时间
     *          超时线程  （超时时间单位）
     *          阻塞队列   Juc13
     *          线程工厂
     *          拒绝策略  （四种） 1 AbortPolicy(),超出最大承载报错   最大承载量 = 阻塞队列数 + 最大线程数
     *                          2 CallerRunsPolicy(),超出时交给其他线程执行（mian）    不抛出异常
     *                          3 DiscardPolicy(),超出丢弃    不抛出异常
     *                          4 DiscardOldestPolicy(),超出和最早的进行比较，成功则执行，失败抛弃    不抛出异常
     */

    /**
     * 最大核心数设置
     *   1 CPU密集型   cpu几核心就设置几 保证cpu最高效运行
     *   2 IO密集型    假设当前程序有15个大型任务（十分消耗io资源） 设置大于这个（一般两倍）
     */
    public static void main(String[] args) {
        //获得cpu核心数
        int i1 = Runtime.getRuntime().availableProcessors();
        System.out.println(i1);

        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,
                3,
                3,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.DiscardOldestPolicy());

        try{
            //最大承载量 = 阻塞队列数 + 最大线程数
            for (int i = 1; i <= 10; i++) {
                threadPoolExecutor.execute(()->{
                    System.out.println(Thread.currentThread().getName());
                });
            }
        }finally {
            threadPoolExecutor.shutdown();
        }


    }
}
